/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Beans;

import Modelo.ControladorBD;
import Modelo.Usuario;
import Utils.Constantes;
import Utils.Mensajes;
import Utils.encriptaCadenas;
import java.io.IOException;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

/**
 *
 * @author HNCR
 */
public class BeanUsuario implements Serializable{
    private Usuario objUsuario_Reg;
    private Usuario objUsuario_log;
    private ArrayList<Usuario> arr_usuario_listar=null;
    private String ver_usu;
    private String cod_trab;
    
    private boolean usuarioLogeado;
    private boolean flgPassIguales;
   
    private String nom_user;
    private String clave_user;

    public Usuario getObjUsuario_Reg() {
        return objUsuario_Reg;
    }

    public void setObjUsuario_Reg(Usuario objUsuario_Reg) {
        this.objUsuario_Reg = objUsuario_Reg;
    }

    public ArrayList<Usuario> getArr_usuario_listar() {
        return arr_usuario_listar;
    }

    public void setArr_usuario_listar(ArrayList<Usuario> arr_usuario_listar) {
        this.arr_usuario_listar = arr_usuario_listar;
    }

    public String getVer_usu() {
        return ver_usu;
    }

    public void setVer_usu(String ver_usu) {
        this.ver_usu = ver_usu;
    }

    public String getCod_trab() {
        return cod_trab;
    }

    public void setCod_trab(String cod_trab) {
        this.cod_trab = cod_trab;
    }

    public Usuario getObjUsuario_log() {
        return objUsuario_log;
    }

    public void setObjUsuario_log(Usuario objUsuario_log) {
        this.objUsuario_log = objUsuario_log;
    }

    public boolean isUsuarioLogeado() {
        return usuarioLogeado;
    }

    public void setUsuarioLogeado(boolean usuarioLogeado) {
        this.usuarioLogeado = usuarioLogeado;
    }

    public boolean isFlgPassIguales() {
        return flgPassIguales;
    }

    public void setFlgPassIguales(boolean flgPassIguales) {
        this.flgPassIguales = flgPassIguales;
    }

    public String getNom_user() {
        return nom_user;
    }

    public void setNom_user(String nom_user) {
        this.nom_user = nom_user;
    }

    public String getClave_user() {
        return clave_user;
    }

    public void setClave_user(String clave_user) {
        this.clave_user = clave_user;
    }

    
    
    //inicializacion
    public void doIniciarUsuarioRegistrar(){
        this.objUsuario_Reg=new Usuario();
    }
    public void doIniciarUsuarioListar(){
        this.arr_usuario_listar=new ArrayList<Usuario>();
    }

    public BeanUsuario() {
        try {
            this.doIniciarUsuarioRegistrar();
        } catch (Exception e) {
            Mensajes.manejarError(e,"Error al Iniciar Proceso");
        }
    }
    
    public String doUsuarioRegistra(){
          
    try
        {
            boolean a = false;
            a = Usuario.crearUsuario(objUsuario_Reg);
            
            if(a){
                Mensajes.guardarMensajeExito("Registro","Registrado correctamente");
                this.doIniciarUsuarioRegistrar();// limpia los datos de la vista cuando se registra
            }
            else{
                 Mensajes.manejarError("Registro","Error al Registrar");                
            }
            
        } catch (Exception e) {
            Mensajes.manejarError(e,"Registrar");
        }   
    
      return null;
    }
    
    public String doVerUsuario(String usuario){
        this.doIniciarUsuarioListar();        
        cod_trab=usuario.toString();
        this.objUsuario_Reg.getObjTrabajador().setCod_trabajador(cod_trab);
        this.ver_usu = Usuario.getVerUsuario(cod_trab);
        
        return this.ver_usu;
    }
    //--------------------------------------------------------------------------------------------------
    
    public  Usuario validar(String us, String pass){
     ResultSet rs=null; 
     Connection conexion = null;
     Usuario user=null;      
     FacesContext contex = FacesContext.getCurrentInstance();
        try{               
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall
            ( "{call sp_usuario_validar(?,?)}");
            st.setString(1,us);                   
            st.setString(2,pass);             
            rs = st.executeQuery();
            if(rs.next()){
                user = new Usuario();
                user.setUsuario(us);                
                user.setCod_usuario(rs.getInt("cod_usuario"));
                //se envia el cod_usuario como una variable de sesion
                contex.getExternalContext().getSessionMap().put("cod_usuario",user.getCod_usuario());
                user.getObjTrabajador().setNombres(rs.getString("nombre"));
                user.getObjTipoUsuario().setCod_tipo_usuario(rs.getInt("cod_tipo_usuario"));
                user.getObjTipoUsuario().setDescripcion(rs.getString("descripcion"));                
                rs.close();                
                conexion.close();                
            }
       
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
                error.printStackTrace();
        }
        return user;
 }
    
    public String loginUsuario(){
        String outcome = null;       
        flgPassIguales=false;
        try{             
            FacesContext contex = FacesContext.getCurrentInstance();                                        
            if(objUsuario_log!=null){                
                objUsuario_log=this.validar(this.nom_user, encriptaCadenas.getStringMessageDigest(this.clave_user,encriptaCadenas.MD5));                                
                if(objUsuario_log != null){          //  
                   Mensajes.addMensajeInfo("Usuario logeado correctamente");                   
                    usuarioLogeado = true;                     
                    contex.getExternalContext().getSessionMap().put("usuario",objUsuario_log);                       
                  contex.getExternalContext().getSessionMap().put("isSesionAlive", usuarioLogeado);                                                                                         
                    outcome=Constantes.PAGE_INGRESO_JSF;                    
               }
               else{
                   Mensajes.addMensajeError("Usuario o Password Incorrectos");                   
                   objUsuario_log= new Usuario();
                   this.nom_user= "";
                   this.clave_user="";
                   outcome=Constantes.PAGE_ACCESO_JSF;                      
               }  
            }
            else{
                Mensajes.addMensajeError("Usuario o Password Incorrectos");
                objUsuario_log= new Usuario();
                   this.nom_user= "";
                   this.clave_user="";                   
                outcome=Constantes.PAGE_ACCESO_JSF;                  
            }
                
        }
        catch(Exception e){
            e.printStackTrace();
            System.out.println(e.getMessage());
        }        
    return outcome+"?faces-redirect=true";         
    }
    
    public void validarSesion() {        
        FacesContext contex = FacesContext.getCurrentInstance();
        try {
            if (contex.getExternalContext().getSessionMap().get("isSesionAlive") == null
                    | contex.getExternalContext().getSessionMap().get("isSesionAlive").
                    toString().trim().equals("false")) {                
                contex.getExternalContext().redirect(Constantes.PAGE_ACCESO_JSF);
                contex.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Autenticacion", "El usuario No existe !!"));

            }
        } catch (Exception e) {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect(Constantes.PAGE_ACCESO_JSF);
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }
            System.out.println(e.getMessage());
        }
        
    }
    
    public void salirSistema(){
        FacesContext contex = FacesContext.getCurrentInstance();  
        this.nom_user="";
        this.clave_user="";
        String outcome =Constantes.PAGE_ACCESO_JSF;
        contex.getExternalContext().getSessionMap().clear();
        contex.getExternalContext().getSessionMap().put("isSesionAlive", false);
        contex.getExternalContext().invalidateSession();
        try {
            contex.getExternalContext().redirect(outcome);
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }

    }
    
}
